/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model.handler;

import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import model.dao.ColetaDAO;
import model.dto.ColetaDTO;
import model.exception.MissingIdException;
import model.exception.NoChangesOnUpdateException;
import model.exception.NotNullFieldsException;

/**
 *
 * @author Gabriel
 */
public class ColetaHandler {

    ColetaDAO coletaDAO;

    public ColetaHandler() throws SQLException, ClassNotFoundException {
        coletaDAO = new ColetaDAO();
    }

    private void verificaCamposNotNullInsercao(ColetaDTO coletaDTO) throws NotNullFieldsException {
        if (coletaDTO.getData() == null) {
            throw new NotNullFieldsException("A Data de Coleta é informação obrigatória em um Registro de Coleta");
        }

        if (coletaDTO.getIdMatriz() == null) {
            throw new NotNullFieldsException("O Conjunto de Matrizes ou Árvore Matriz específica é informação obrigatória em um Registro de Coleta");
        }
    }

    private void verificaCamposNotNullAtualizacao(ColetaDTO coletaDTO,
                                                  boolean atualizaIdMatriz,
                                                  boolean atualizaData) throws NotNullFieldsException {
        if ((coletaDTO.getData() == null) && atualizaData) {
            throw new NotNullFieldsException("A Data de Coleta é informação obrigatória em um Registro de Coleta");
        }

        if ((coletaDTO.getIdMatriz() == null) && atualizaIdMatriz) {
            throw new NotNullFieldsException("O Conjunto de Matrizes ou Árvore Matriz específica é informação obrigatória em um Registro de Coleta");
        }
    }

    public LinkedList<ColetaDTO> getTodasColetas() throws SQLException {
        return coletaDAO.getTodasColetas();
    }

    public LinkedList<ColetaDTO> pesquisaColeta(Integer id,
                                                Date data,
                                                Integer idMatriz,
                                                String nomeEspecie) throws SQLException {
        return coletaDAO.pesquisaColeta(id, data, idMatriz, nomeEspecie);

    }

    public void cadastraColeta(ColetaDTO coletaDTO) throws SQLException, NotNullFieldsException {
        verificaCamposNotNullInsercao(coletaDTO);
        coletaDAO.insereRegistroSaida(coletaDTO);
    }

    public void atualizaColeta(ColetaDTO coletaDTO,
                                      boolean atualizaIdMatriz,
                                      boolean atualizaData) throws SQLException, NotNullFieldsException, NoChangesOnUpdateException, MissingIdException {

        // Verifica se o identificador foi passado
        if (coletaDTO.getId() == null) {
            throw new MissingIdException();
        }
        
        verificaCamposNotNullAtualizacao(coletaDTO, atualizaIdMatriz, atualizaData);

        /* Verifica se existe atualização */
        if (!(atualizaData || atualizaIdMatriz)) {
            throw new NoChangesOnUpdateException();
        }

        coletaDAO.atualizaRegistroSaida(coletaDTO, atualizaIdMatriz, atualizaData);
    }

}
